﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using Ext.Net;
using System.Web.UI.WebControls;
using Sio.Mdm.Entities;
using System.Configuration;
using System.IO;
using Excel;
using System.Data;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Client;
using Sio.Mdm.BF.Idm;
using System.Text;

namespace Sio.Mdm.Web.Uporabnik
{


    public partial class UvozCarovnik : Controls.Page
    {
        List<UcecUvoz> _podatki = new List<UcecUvoz>();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack && !X.IsAjaxRequest)
            {
                this.btnUvozi.Hide();
                //šolskaLeta
                EntityCollection<SolskoLeto> solskaLeta = new EntityCollection<SolskoLeto>(
                  new Filter<SolskoLeto>().Where(o => o.LetoId != null).OrderByDescending(o => o.KonecLeta));
                this.StoreSolskaLeta.DataSource = solskaLeta;
                this.StoreSolskaLeta.DataBind();
            }
        }

        private string UploadExcelPath
        {
            get
            {
                var tmp = ConfigurationSettings.AppSettings["UploadExcelPath"];

                if (tmp.StartsWith("~"))
                {
                    tmp = String.Format("{0}/{1}", AppDomain.CurrentDomain.BaseDirectory, tmp.Replace("~/", ""));
                }
                return tmp;
            }
        }

        protected bool PreberiClick(object sender, DirectEventArgs e)
        {

            if (String.IsNullOrEmpty(this.BasicField.FileName) & (cbSolskoLeto.SelectedIndex.ToString() == "-1"))
            {
                X.Msg.Alert("Manjkajoči podatki", "Odprite excel datoteko in izberite šolsko leto.").Show();

                return false;
            }

            if (!Directory.Exists(UploadExcelPath))
            {
                X.Msg.Alert("Napaka pri nalaganju datoteke.", "Datoteke ni mogoče shraniti. <br /> Začasna mapa ne obstaja ali pa pravice niso ustrezno nastavljene. <br> Obrnite se na administratorja. <br> Začasna mapa: " + UploadExcelPath).Show();
                return false;
            }

            try
            {
                Request.Files[0].SaveAs(UploadExcelPath + this.BasicField.FileName);

                if (!File.Exists(UploadExcelPath + this.BasicField.FileName))
                {
                    X.Msg.Alert("Napaka pri nalaganju datoteke.", "Datoteke ni na začasnem mestu " + UploadExcelPath + ". <br /> Najverjetneje gre za napako v konfiguraciji začasne mape. <br> Obrnite se na administratorja. ").Show();
                    return false;
                }
            }
            catch
            {
                X.Msg.Alert("Napaka pri nalaganju datoteke.", "Datoteke ni mogoče shraniti na mesto: " + UploadExcelPath + this.BasicField.FileName + ". <br /> Najverjetneje gre za napako v konfiguraciji začasne mape. <br> Obrnite se na administratorja. ").Show();
                return false;
            }

            if (UvoziExcel(UploadExcelPath + this.BasicField.FileName))
                return true;
            else
            {
                //X.Msg.Alert("Nepravilni podatki", "Podatki, ki jih želite naložiti niso v pravilni obliki. <br /> Preverite število stolpcev in njihova imena.").Show();
                return false;
            }
        }

        public bool UvoziExcel(string filePath)
        {
            FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelReader = null;

            if (String.Compare(Path.GetExtension(filePath), ".xls", true) == 0)
                excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//1. Reading from a binary Excel file ('97-2003 format; *.xls)
            else if (String.Compare(Path.GetExtension(filePath), ".xlsx", true) == 0)
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)

            DataSet result = excelReader.AsDataSet();

            excelReader.IsFirstRowAsColumnNames = true;

            DataSet resultRow = excelReader.AsDataSet();

            DataTable resulttable = new DataTable("Uvoz");
            resulttable = excelReader.AsDataSet().Tables[0];

            _podatki.Clear();
            if (resulttable.Columns.Count != 9)
            {
                excelReader.Close();
                X.Msg.Alert("Nepravilni podatki", "Podatki, ki jih želite naložiti niso v pravilni obliki. <br /> Preverite število stolpcev in njihova imena.").Show();
                return false;
            }

            foreach (DataRow row in resulttable.Rows)
            {
                UcecUvoz ucec = new UcecUvoz();
                try
                {
                    ucec.Ime = row["Ime"].ToString();
                    ucec.Priimek = row["Priimek"].ToString();
                    ucec.Spol = row["Spol"].ToString();
                    ucec.Emso = row["Emšo"].ToString();
                    ucec.Naslov = row["Naslov"].ToString();
                    ucec.Posta = row["Pošta"].ToString();
                    ucec.Email = row["E-naslov"].ToString();
                    ucec.Telefon = row["Telefon"].ToString();
                    ucec.Razred = row["Razred"].ToString();
                    ucec.Uid = _podatki.Count + 1;
                    _podatki.Add(ucec);
                }
                catch
                {
                    excelReader.Close();
                    return false;
                }
            }
            this.Store1.DataSource = _podatki;
            this.Store1.DataBind();

            //6. Free resources (IExcelDataReader is IDisposable)
            excelReader.Close();
            return true;
        }

        private int VrniRazredSkupino(string oznaka, int letoId)
        {
            int razred = Convert.ToInt16(oznaka[0].ToString());
            string paralelka = "";
            if (oznaka.Length <= 2)
            {
                paralelka = oznaka[1].ToString();
            }
            else
            {
                for (int i = 1; i < oznaka.Length; i++)
                {
                    paralelka = paralelka + oznaka[i].ToString();
                }
            }
            var razredSkupina = new EntityCollection<RazredSkupina>(new Filter<RazredSkupina>().Where(r => r.LetoId == letoId && r.OrganizacijaId == this.UserSession.Organizacija).Where(r => r.Razred == razred).Where(r => r.Paralelka == paralelka.ToUpper()));

            if (razredSkupina.Count > 0)
            {
                return razredSkupina.First().RazredId;
            }
            else
            {
                if (chkUstvariRazrede.Checked)
                {
                    RazredSkupina ent = EntityFactory.CreateInstance<RazredSkupina>();
                    ent.Razred = razred;
                    ent.Paralelka = paralelka.ToUpper();
                    ent.Oznaka = oznaka;
                    ent.LetoId = letoId;
                    ent.OrganizacijaId = this.UserSession.Organizacija;
                    ent.Update();
                    return ent.RazredId;
                } 
                else
                return -1;
            }
        }


        private void PreveriRazrede(Dictionary<string, string>[] uceci, int letoId)
        {
            StringBuilder napake = new StringBuilder();

            foreach (var row in uceci)
            {
                string oznaka = row["Razred"];
                if (VrniRazredSkupino(oznaka, letoId) == -1)
                {
                    napake.AppendFormat("{0},", oznaka);
                }
            }

            if (napake.Length > 0)
            {
                X.Msg.Alert("Napaka pri uvozu.", "Učencev ni mogoče uvoziti, saj manjkajo razredi: <br>"+napake+".<br><br> Pred uvozom je potreno ustvariti ustrezne razrede v šolskem letu <br> ali izbrati možnost avtomatskega kreiranja razredov.").Show();
            }
        }

        protected void UvoziClick(object sender, DirectEventArgs e)
        {
            string json = e.ExtraParams["selected"];

            if (string.IsNullOrEmpty(json) || json == "[]")
            {
                X.Msg.Alert("Manjkajoči podatki", "Izberite učeče, ki jih želite uvoziti.").Show();
                return;
            }

            Dictionary<string, string>[] uceciPodatki = JSON.Deserialize<Dictionary<string, string>[]>(json);

            if (string.IsNullOrEmpty(json) || json == "[]")
            {
                X.Msg.Alert("Manjkajoči podatki", "Izberite učeče, ki jih želite uvoziti.").Show();
                return;
            }

            if (cbSolskoLeto.SelectedItem.Value == "")
            {
                X.Msg.Alert("Napaka pri uvozu.", "Potrebno je izbrati šolsko leto.").Show();
                return;
            }
            int letoID = Convert.ToInt32(this.cbSolskoLeto.Value);

            PreveriRazrede(uceciPodatki, letoID);

            foreach (Dictionary<string, string> row in uceciPodatki)
            {
                Ucec ucecPreverjanje = EntityFactory.LoadEntity<Ucec>
                  (new Filter<Ucec>().Where(r => (r.Ime == row["Ime"] && r.Priimek == row["Priimek"] && r.Emso == Convert.ToInt64(row["Emso"])))
                  );
                if (ucecPreverjanje.EntityState != EntityState.Error)
                {
                    UcecUvoz ucecObstaja = new UcecUvoz();
                    ucecObstaja.Ime = row["Ime"];
                    ucecObstaja.Priimek = row["Priimek"];
                    ucecObstaja.Spol = row["Spol"];
                    ucecObstaja.Emso = row["Emso"];
                    ucecObstaja.Naslov = row["Naslov"];
                    ucecObstaja.Posta = row["Posta"];
                    ucecObstaja.Email = row["Email"];
                    ucecObstaja.Telefon = row["Telefon"];
                    ucecObstaja.Razred = row["Razred"];
                    ucecObstaja.Uid = _podatki.Count + 1;
                    _podatki.Add(ucecObstaja);
                }
                else
                {
                    Ucec ucec = EntityFactory.CreateInstance<Ucec>();
                    ucec.Ime = row["Ime"];
                    ucec.Priimek = row["Priimek"];
                    ucec.Naslov = row["Naslov"];
                    ucec.Emso = Convert.ToInt64(row["Emso"]);
                    if (row["Spol"] == "Moški")
                        ucec.Spol = 0;
                    else
                        ucec.Spol = 1;

                    ucec.Email = row["Email"];
                    //ucec.DavcnaStevilka = Convert.ToInt32(row["Davcna"]);
                    //ucec.Spol = Convert.ToInt32(row["Spol"]);


                    PostnaStevilka postnaStevilka = EntityFactory.LoadEntity<PostnaStevilka>
                      (new Filter<PostnaStevilka>().Where(r => (r.PostnaStevilka == Convert.ToInt32(row["Posta"])))
                      );
                    if (postnaStevilka.EntityState != EntityState.Error)
                    {
                        ucec.PostaId = postnaStevilka.PostaId;
                    }

                    //obvezen dodatek za trigger
                    ucec.OrganizacijaId = this.UserSession.Organizacija;
                    ucec.TipVlogeId = 3;  //fiksno za ucece...

                    var slService = ServiceFactory.GetService<IUceciService>();
                    slService.Create(ucec, this.UserSession);

                    string oznaka = row["Razred"];
                    
                    //vstavljanje statusa
                    {
                        UcecStatus ucecStatus = EntityFactory.CreateInstance<UcecStatus>();
                        ucecStatus.VlogaId = ucec.VlogaId;
                        int idm = ucec.IdmStevilka;
                        ucecStatus.RazredId = VrniRazredSkupino(oznaka, letoID);
                        ucecStatus.LetoId = letoID;
                        var slServiceUcecStatus = ServiceFactory.GetService<IUceciStatusiService>();
                        slServiceUcecStatus.Create(ucecStatus, this.UserSession);
                    }
                }
            }
            //prikažemo podatke, ki so že shranjeni v bazi
            if (_podatki.Count > 0)
            {
                this.Store2.DataSource = _podatki;
                this.Store2.DataBind();
                this.GridPanel2.Show();
            }
            else
            {
                this.Label1.Show();
            }
            this.PanelWizard.ActiveIndex = 2;
            this.btnNext.Hide();
            this.btnPrev.Hide();
            this.btnUvozi.Hide();
        }
    }



    public class UcecUvoz
    {
        public int Uid { get; set; }
        public string Ime { get; set; }
        public string Priimek { get; set; }
        public string Spol { get; set; }
        public string Naslov { get; set; }
        public string Emso { get; set; }
        public string Posta { get; set; }
        public string Razred { get; set; }
        public string Telefon { get; set; }
        public string Email { get; set; }
    }
}
